from xen.xm import create, destroy, migrate, shutdown, sysrq
from xen.xm.opts import *
+def unit(c):
+ if not c.isalpha():
+ return 0
+ base = 1
+ if c == 'G' or c == 'g': base = 1024 * 1024 * 1024
+ elif c == 'M' or c == 'm': base = 1024 * 1024
+ elif c == 'K' or c == 'k': base = 1024
+ else:
+ print 'ignoring unknown unit'
+ return base
+
+def int_unit(str, dest):
+ base = unit(str[-1])
+ if not base:
+ return int(str)
+
+ value = int(str[:-1])
+ dst_base = unit(dest)
+ if dst_base == 0:
+ dst_base = 1
+ if dst_base > base:
+ return value / (dst_base / base)
+ else:
+ return value * (base / dst_base)
+
class Group:
name = ""
def main(self, args):
if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0])
dom = args[1]
- mem = int(args[2])
+ mem = int_unit(args[2], 'm')
server.xend_domain_maxmem_set(dom, mem)
xm.prog(ProgMaxmem)
def main(self, args):
if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0])
dom = args[1]
- mem_target = int(args[2])
+ mem_target = int_unit(args[2], 'm')
server.xend_domain_mem_target_set(dom, mem_target)
xm.prog(ProgBalloon)
/* opt_dom0_mem: Kilobytes of memory allocated to domain 0. */
static unsigned int opt_dom0_mem = 0;
-integer_param("dom0_mem", opt_dom0_mem);
+integer_unit_param("dom0_mem", opt_dom0_mem);
#if defined(__i386__)
/* No ring-3 access in initial leaf page tables. */
*(unsigned int *)param->var =
simple_strtol(opt, (char **)&opt, 0);
break;
+ case OPT_UINT_UNIT:
+ if ( opt != NULL )
+ {
+ int base = 1;
+ unsigned int value;
+
+ value = simple_strtoul(opt, (char **)&opt, 0);
+ if (*opt == 'G' || *opt == 'g') {
+ base = 1024 * 1024;
+ opt++;
+ } if (*opt == 'M' || *opt == 'm') {
+ base = 1024;
+ opt++;
+ } else if (*opt == 'K' || *opt == 'k')
+ opt++;
+ *(unsigned int *) param->var = value * base;
+ }
+ break;
case OPT_BOOL:
*(int *)param->var = 1;
break;
*/
struct kernel_param {
const char *name;
- enum { OPT_STR, OPT_UINT, OPT_BOOL } type;
+ enum { OPT_STR, OPT_UINT, OPT_UINT_UNIT, OPT_BOOL } type;
void *var;
unsigned int len;
};
static char __setup_str_##_var[] __initdata = _name; \
static struct kernel_param __setup_##_var __attribute_used__ \
__initsetup = { __setup_str_##_var, OPT_UINT, &_var, sizeof(_var) }
+#define integer_unit_param(_name, _var) \
+ static char __setup_str_##_var[] __initdata = _name; \
+ static struct kernel_param __setup_##_var __attribute_used__ \
+ __initsetup = { __setup_str_##_var, OPT_UINT_UNIT, &_var, sizeof(_var) }
#define string_param(_name, _var) \
static char __setup_str_##_var[] __initdata = _name; \
static struct kernel_param __setup_##_var __attribute_used__ \